home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Games of Daze
/
Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso
/
x2ftp
/
msdos
/
xlib
/
xlib06
/
xcbitm32.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-05-23
|
4KB
|
189 lines
#include "xbmtools.h"
/* these are here instead of the header file because they're not part
of the library interface */
// rol al
#define ROL_AL 0xc0d0
// mov [si + disp8], imm8
#define SHORT_STORE_8 0x44c6
// mov [si + disp16], imm8
#define STORE_8 0x84c6
// mov [si + disp8], imm16
#define SHORT_STORE_16 0x44c7
// mov [si + disp16], imm16
#define STORE_16 0x84c7
// adc si, imm8
#define ADC_SI_IMMED 0xd683
// out dx, al
#define OUT_AL 0xee
// ret
#define RETURN 0xcb
// 32-bit prefix
#define DWORD_PREFIX 0x66
#define Emitb(x) *(output + output_used) = (x); output_used++
#define Emitw(x) *(output + output_used) = (x) & 255; \
*(output + output_used + 1) = (x) >> 8; \
output_used += 2
int x_compile_bitmap_32 (int logical_screen_width, char far * bitmap,
char far * output)
{
int pix0, pix1, pix2, pix3, numpix, pos;
int column = 0, set_column = 0;
int scanx = 0, scany = 0;
int output_used = 0;
int height = LBMHeight(bitmap);
int width = LBMWidth(bitmap);
int margin = width - 1;
int margin2 = margin - 4;
int margin4 = margin - 12;
while (column < 4) {
numpix = 1;
pix0 = LBMGetPix(scanx, scany, bitmap);
if (pix0 != 0) {
if (set_column != column) {
do {
Emitw (ROL_AL);
Emitw (ADC_SI_IMMED);
Emitb (0);
set_column++;
} while (set_column != column);
Emitb (OUT_AL);
}
if (scanx <= margin2) {
pix1 = LBMGetPix(scanx + 4, scany, bitmap);
if ((pix1 != 0)
&&(scanx <= margin4)) {
numpix = 2;
pix2 = LBMGetPix(scanx + 8, scany, bitmap);
pix3 = LBMGetPix(scanx + 12, scany, bitmap);
if ((pix2 != 0) && (pix3 != 0)) {
numpix = 4;
Emitb (DWORD_PREFIX);
}
}
}
pos = (scany * logical_screen_width) + (scanx >> 2) - 128;
if ((pos >= -128) && (pos <= 127)) {
if (numpix == 1) {
Emitw (SHORT_STORE_8);
Emitb (pos);
Emitb (pix0);
} else {
Emitw (SHORT_STORE_16);
Emitb (pos);
Emitb (pix0);
Emitb (pix1);
if (numpix == 4) {
Emitb (pix2);
Emitb (pix3);
}
}
} else {
if (numpix == 1) {
Emitw (STORE_8);
Emitw (pos);
Emitb (pix0);
} else {
Emitw (STORE_16);
Emitw (pos);
Emitb (pix0);
Emitb (pix1);
if (numpix == 4) {
Emitb (pix2);
Emitb (pix3);
}
}
}
}
scanx += (numpix << 2);
if (scanx > margin) {
scanx = column;
scany++;
if (scany == height) {
scany = 0;
column++;
}
}
}
Emitb(RETURN);
return(output_used);
}
int x_sizeof_cbitmap_32 (int logical_screen_width, char far * bitmap)
{
int pix0, pix1, pix2, pix3, numpix, pos;
int column = 0, set_column = 0;
int scanx = 0, scany = 0;
int output_used = 1;
int height = LBMHeight(bitmap);
int width = LBMWidth(bitmap);
int margin = width - 1;
int margin2 = margin - 4;
int margin4 = margin - 12;
while (column < 4) {
numpix = 1;
pix0 = LBMGetPix(scanx, scany, bitmap);
if (pix0 != 0) {
if (set_column != column) {
do {
output_used += 5;
set_column++;
} while (set_column != column);
output_used++;
}
if (scanx <= margin2) {
pix1 = LBMGetPix(scanx + 4, scany, bitmap);
if ((pix1 != 0)
&&(scanx <= margin4)) {
numpix = 2;
pix2 = LBMGetPix(scanx + 8, scany, bitmap);
pix3 = LBMGetPix(scanx + 12, scany, bitmap);
if ((pix2 != 0) && (pix3 != 0)) {
numpix = 4;
output_used++;
}
}
}
pos = (scany * logical_screen_width) + (scanx >> 2) - 128;
if ((pos >= -128) && (pos <= 127)) {
if (numpix == 1) {
output_used += 4;
} else {
output_used += 5;
if (numpix == 4)
output_used += 2;
}
} else {
if (numpix == 1) {
output_used += 5;
} else {
output_used += 6;
if (numpix == 4)
output_used += 2;
}
}
}
scanx += (numpix << 2);
if (scanx > margin) {
scanx = column;
scany++;
if (scany == height) {
scany = 0;
column++;
}
}
}
return(output_used);
}